home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / myapp / 3d / 3ddos / 3ddos.cpp next >
Encoding:
C/C++ Source or Header  |  1996-05-01  |  23.3 KB  |  810 lines

  1.  
  2. // 3ddos.cpp
  3.  
  4. #include "stdgfx.h"
  5. #include "mpgui.h"
  6. #include "mpg3d.h"
  7.  
  8. BOOLEAN ReadConfigFile ( STRING FileName );
  9. VOID HandleInput ( G3DSYSTEM* G3D, G3DCAMERA *Camera );
  10. BOOLEAN Create3DDatabase ( G3DSYSTEM *G3D );
  11. VOID DoBenchMark ( G3DSYSTEM *G3D );
  12.  
  13. IMAGE *VScreen;
  14. INT VideoMode;
  15. BOOLEAN Debug;
  16. float ViewDistance;
  17. float NearClipZ;
  18. BOOLEAN DepthCueing = FALSE;
  19. float DepthScale = 1;
  20. BOOLEAN DoHaze = FALSE;
  21. COLORTABLE *HazeTable;
  22. CHAR HazeTableName[128];
  23. float HazeScale = 1;
  24.  
  25. CHAR ObjectFileName[128];
  26. float ScaleFactor = 1.0;
  27. BOOLEAN ClockWise = FALSE;
  28. float ObjPosX,ObjPosY,ObjPosZ;
  29. float ObjRotX,ObjRotY,ObjRotZ;
  30. float MaxVisibleDistance;
  31. BOOLEAN LoadAll;
  32.  
  33. CHAR TextureFileName[128];
  34. BOOLEAN MapTexture;
  35. float U0,V0;
  36. float U1,V1;
  37. float U2,V2;
  38. LONG TextureType;
  39. ANIMIMAGE *Texture;
  40. LONG TextureNumFrames=0;
  41. LONG CurTextureFrame=0;
  42.  
  43. CHAR ShadeTableFileName[128];
  44. COLORTABLE *ShadeTable;
  45. float LightPosX,LightPosY,LightPosZ;
  46. float LightMaxIntensity;
  47. float LightMinIntensity;
  48. INT AmbientRed,AmbientGreen,AmbientBlue;
  49. BOOLEAN FollowCamera=TRUE;
  50. G3DLIGHT *MyLight;
  51.  
  52. float CameraPosX,CameraPosY,CameraPosZ;
  53. float CameraAngX,CameraAngY,CameraAngZ;
  54. float AddX,AddY,AddZ;
  55.  
  56. BOOLEAN BGBitMap;
  57. CHAR BGFileName[128];
  58. IMAGE *BGImage;
  59. INT BGRed,BGGreen,BGBlue;
  60. BYTE BGColor;
  61.  
  62. BOOLEAN UseTransparent;
  63. COLORTABLE *BlendTable;
  64. CHAR BlendFileName[128];
  65.  
  66. BOOLEAN ReadConfigFile ( STRING FileName )
  67.   {
  68.     FILEHANDLE f;
  69.     
  70.     f = File.Open ( FileName, OPEN_READ );
  71.     if (f==NULL)
  72.       {
  73.         printf ("Can not open this file!\n" );
  74.         return FAILURE;
  75.       } // End else
  76.  
  77.     CHAR Str[128];
  78.     printf ( "Screen Section\n" );
  79.     fscanf ( f, "SCREEN\n" );
  80.     fscanf ( f, "  BEGIN\n" );
  81.     fscanf ( f, "    MODE = %s\n", Str );    
  82.     if (strcmp(Str,"320x200x256")==0)
  83.       VideoMode = M320x200x256;
  84.     else if (strcmp(Str,"640x400x256")==0)
  85.       VideoMode = M640x400x256;
  86.     else if (strcmp(Str,"640x480x256")==0)
  87.       VideoMode = M640x480x256;
  88.     else if (strcmp(Str,"800x600x256")==0)
  89.       VideoMode = M800x600x256;
  90.     else if (strcmp(Str,"1024x768x256")==0)
  91.       VideoMode = M1024x768x256;
  92.     else
  93.       {
  94.         printf ("Unknown Video Mode!\n" );
  95.         return FAILURE;
  96.       } // End else      
  97.     printf ( "  Screen = %s\n", Str );
  98.  
  99.     fscanf ( f, "    DEBUG = %s\n", Str );
  100.     if (strcmp(Str,"YES")==0)
  101.       Debug = TRUE;
  102.     else
  103.       Debug = FALSE;
  104.  
  105.     printf ( "  Debug = %s\n", Str );
  106.  
  107.     fscanf ( f, "    VIEW DISTANCE = %f\n", &ViewDistance );
  108.     printf ( "  View Distance = %f\n", ViewDistance );
  109.  
  110.     fscanf ( f, "    NEAR CLIP Z = %f\n", &NearClipZ );
  111.     printf ( "  Near Clip Z = %f\n", NearClipZ );
  112.     
  113.     fscanf ( f, "    DEPTH CUE = %s\n", Str );
  114.     if (strcmp(Str,"YES")==0)
  115.       DepthCueing = TRUE;
  116.     else
  117.       DepthCueing = FALSE;
  118.     printf ( "  Depth Cueing = %s\n", Str );
  119.  
  120.     fscanf ( f, "    DEPTH SCALE = %f\n", &DepthScale );
  121.     printf ( "  Depth Scale = %f\n", DepthScale );
  122.       
  123.     fscanf ( f, "    HAZE = %s\n", Str );
  124.     if (strcmp(Str,"YES")==0)
  125.       DoHaze = TRUE;
  126.     else
  127.       DoHaze = FALSE;
  128.     printf ( "  Haze = %s\n", Str );
  129.  
  130.     fscanf ( f, "    HAZE FILE = %s\n", HazeTableName );
  131.     printf ( "  HAZE FILE = %s\n", HazeTableName );
  132.  
  133.     fscanf ( f, "    HAZE SCALE = %f\n", &HazeScale );
  134.     printf ( "  Haze File = %f\n", HazeScale );
  135.       
  136.     fscanf ( f, "  END\n" );      
  137.     fscanf ( f, "\n" );
  138.     printf ( "End of Screen Section\n\n" );
  139.     
  140.     printf ( "Object Section\n" );
  141.     fscanf ( f, "OBJECT\n" );
  142.     fscanf ( f, "  BEGIN\n" );
  143.     fscanf ( f, "    FILE = %s\n", ObjectFileName );
  144.     printf ( "  Object File = %s\n", ObjectFileName );
  145.  
  146.     fscanf ( f, "    POSITION = %f %f %f\n", &ObjPosX, &ObjPosY, &ObjPosZ );    
  147.     printf ( "  Position = %f %f %f\n", ObjPosX, ObjPosY, ObjPosZ );
  148.  
  149.     fscanf ( f, "    SCALE = %f\n", &ScaleFactor );
  150.     printf ( "  Scale = %f\n", ScaleFactor );
  151.  
  152.     fscanf ( f, "    MAX VISIBLE DISTANCE = %f\n", &MaxVisibleDistance );
  153.     printf ( "  Max Visible Distance = %f\n", MaxVisibleDistance );
  154.  
  155.     fscanf ( f, "    ROTATE = %f %f %f\n", &ObjRotX, &ObjRotY, &ObjRotZ );
  156.     printf ( "  Rotate = %f %f %f\n", ObjRotX, ObjRotY, ObjRotZ );
  157.  
  158.     fscanf ( f, "    LOAD ALL = %s\n", Str );
  159.     if (strcmp(Str,"YES")==0)
  160.       LoadAll = TRUE;
  161.     else
  162.       LoadAll = FALSE;  
  163.     printf ( "  Load All = %s\n", Str );
  164.  
  165.     fscanf ( f, "    CLOCKWISE = %s\n", Str );
  166.     if (strcmp(Str,"YES")==0)
  167.       ClockWise = TRUE;
  168.     else
  169.       ClockWise = FALSE;  
  170.     printf ( "  Clock Wise = %s\n", Str );
  171.  
  172.     fscanf ( f, "  END\n" );
  173.     fscanf ( f, "\n" );
  174.     printf ( "End of Object Section\n\n" );
  175.     
  176.     printf ( "Material Section\n" );
  177.     fscanf ( f, "MATERIAL\n" );
  178.     fscanf ( f, "  BEGIN\n" );
  179.     fscanf ( f, "    FILE = %s\n", TextureFileName );
  180.     printf ( "  Texture File %s\n", TextureFileName );
  181.  
  182.     fscanf ( f, "    TYPE = %s\n", Str );    
  183.     if (strcmp(Str,"STATIC")==0)
  184.       TextureType = TEXTURE_STATIC;
  185.     else if (strcmp(Str,"FLIC")==0)
  186.       TextureType = TEXTURE_FLIC;
  187.     else if (strcmp(Str,"ANIM")==0)
  188.       TextureType = TEXTURE_ANIM;
  189.     else
  190.       TextureType = 0;  
  191.     printf ( "  Type %s\n", Str );
  192.  
  193.     fscanf ( f, "    AMBIENT = %d %d %d\n", &AmbientRed, &AmbientGreen, &AmbientBlue );
  194.     printf ( "  Ambient = %d %d %d\n", AmbientRed, AmbientGreen, AmbientBlue );
  195.  
  196.     fscanf ( f, "    MAP TEXTURE = %s\n", Str );
  197.     if (strcmp(Str,"YES")==0)
  198.       MapTexture = TRUE;
  199.     else
  200.       MapTexture = FALSE;  
  201.     printf ( "  Map Texture = %s\n", Str );
  202.  
  203.     fscanf ( f, "    U0 V0 = %f %f\n", &U0, &V0 );
  204.     printf ( "U0 = %f  V0 = %f\n", U0, V0 );
  205.     fscanf ( f, "    U1 V1 = %f %f\n", &U1, &V1 );
  206.     printf ( "U1 = %f  V1 = %f\n", U1, V1 );
  207.     fscanf ( f, "    U2 V2 = %f %f\n", &U2, &V2 );
  208.     printf ( "U2 = %f  V2 = %f\n", U2, V2 );
  209.     
  210.     fscanf ( f, "    TRANSPARENT = %s\n", Str );
  211.     if (strcmp(Str,"YES")==0)
  212.       UseTransparent = TRUE;
  213.     else
  214.       UseTransparent = FALSE;  
  215.     printf ( "  Transparent = %s\n", Str );
  216.  
  217.     fscanf ( f, "  END\n" );
  218.     fscanf ( f, "\n" );
  219.     printf ( "End of Material Section\n\n" );
  220.         
  221.     printf ( "Light Section\n" );
  222.     fscanf ( f, "LIGHT\n" );
  223.     fscanf ( f, "  BEGIN\n" );
  224.     fscanf ( f, "    FILE = %s\n", ShadeTableFileName );
  225.     printf ( "  Shade Table File = %s\n", ShadeTableFileName );
  226.  
  227.     fscanf ( f, "    POSITION = %f %f %f\n", &LightPosX, &LightPosY, &LightPosZ );
  228.     printf ( "  Position = %f %f %f\n", LightPosX, LightPosY, LightPosZ );
  229.  
  230.     fscanf ( f, "    FOLLOW CAMERA = %s\n", Str );
  231.     if (strcmp(Str,"YES")==0)
  232.       FollowCamera = TRUE;
  233.     else
  234.       FollowCamera = FALSE;  
  235.     printf ( "  FOLLOW CAMERA = %s\n", Str );
  236.     
  237.     fscanf ( f, "    MAX INTENSITY = %f\n", &LightMaxIntensity );
  238.     printf ( "  Max Intensity = %f\n", LightMaxIntensity );
  239.  
  240.     fscanf ( f, "    MIN INTENSITY = %f\n", &LightMinIntensity );
  241.     printf ( "  Min Intensity = %f\n", LightMinIntensity );
  242.  
  243.     fscanf ( f, "  END\n" );
  244.     fscanf ( f, "\n" );
  245.     printf ( "End of Light Section\n\n" );
  246.         
  247.     printf ( "Camera Section\n" );
  248.     fscanf ( f, "CAMERA\n" );
  249.     fscanf ( f, "  BEGIN\n" );
  250.     fscanf ( f, "    POSITION = %f %f %f\n", &CameraPosX, &CameraPosY, &CameraPosZ );
  251.     printf ( "  Position = %f %f %f\n", CameraPosX, CameraPosY, CameraPosZ );
  252.  
  253.     fscanf ( f, "    ANGLE = %f %f %f\n", &CameraAngX, &CameraAngY, &CameraAngZ );
  254.     printf ( "  Angle = %f %f %f\n", CameraAngX, CameraAngY, CameraAngZ );
  255.  
  256.     fscanf ( f, "  END\n" );
  257.     fscanf ( f, "\n" );
  258.     printf ( "End of Camera Section\n\n" );
  259.  
  260.     printf ( "Background Section\n" );
  261.     fscanf ( f, "BACKGROUND\n" );
  262.     fscanf ( f, "  BEGIN\n" );
  263.     fscanf ( f, "    FILE = %s\n", BGFileName );
  264.     if (strcmp(BGFileName,"NULL")==0)
  265.       BGBitMap = FALSE;
  266.     else
  267.       BGBitMap = TRUE;
  268.     printf ( "  Background File Name = %s\n", BGFileName );
  269.  
  270.     fscanf ( f, "    COLOR = %d %d %d\n", &BGRed, &BGGreen, &BGBlue );
  271.     printf ( "  Color = %d %d %d\n", BGRed, BGGreen, BGBlue );
  272.  
  273.     fscanf ( f, "  END\n" );
  274.     fscanf ( f, "\n" );
  275.     printf ( "End of Background Section\n\n" );
  276.  
  277.     printf ( "Color Blending Section\n" );
  278.     fscanf ( f, "COLOR BLENDING\n" );
  279.     fscanf ( f, "  BEGIN\n" );
  280.     fscanf ( f, "    FILE = %s\n", BlendFileName );
  281.     printf ( "  Blend File Name = %s\n", BlendFileName );
  282.  
  283.     fscanf ( f, "  END\n" );
  284.     printf ( "End of Color Blending Section\n\n" );
  285.  
  286.     File.Close ( f );
  287.  
  288.     return SUCCESS;    
  289.   } // End of ReadConfigFile
  290.  
  291. BOOLEAN BenchMark = FALSE;
  292.  
  293. MAINPROGRAM
  294.   BEGIN
  295.     printf ("\n3D Program Demo ver 2.0\n" );
  296.     printf ("    By Toshiaki Tsuji\n\n" );
  297.  
  298.     U0 = V0 = (float)0;
  299.     U1 = (float)0;
  300.     V1 = (float)0.25;
  301.     U2 = V2 = (float)0.25;
  302.     
  303.     VScreen = new IMAGE ( IMAGE_TOPDOWN );
  304.     BGImage = new IMAGE ( IMAGE_TOPDOWN );
  305.     ShadeTable = new COLORTABLE ();
  306.     BlendTable = new COLORTABLE ();
  307.     HazeTable = new COLORTABLE ();
  308.  
  309.     if (GetNumArgs()==0)
  310.       {
  311.         printf ("You must specify config file!\n" );
  312.         exit (0);
  313.       } // End if
  314.     if (GetNumArgs()==2)
  315.       {
  316.         CHAR ExStr[128];
  317.         GetArg ( 1, ExStr );
  318.         
  319.         if (strcmp( ExStr, "/b")==0)
  320.           BenchMark = TRUE; 
  321.       } // End if  
  322.  
  323.     CHAR ConfigFile[128];
  324.     
  325.     GetArg ( 0, ConfigFile );
  326.     printf ( "Initializing please wait ...\n\n" );
  327.     if (ReadConfigFile ( ConfigFile )==FAILURE)
  328.       {
  329.         printf ("Error reading config file!\n" );
  330.         exit (0);
  331.       } // End if
  332.     else
  333.       {
  334.         printf ("Config File Loaded.\n\n" );
  335.       } // End if      
  336.     
  337.     G3DSYSTEM G3D;
  338.     G3DCAMERA Camera;
  339.     
  340.     Camera.Move ( CameraPosX, CameraPosY, CameraPosZ );
  341.     Camera.SetAngle ( CameraAngX, CameraAngY, CameraAngZ );
  342.  
  343.     G3D.SetDestination ( VScreen );
  344.     G3D.SetViewDistance ( ViewDistance );
  345.     G3D.SetNearClipZ ( NearClipZ );
  346.     G3D.SetDepthCueing ( DepthCueing, DepthScale );
  347.     
  348.     if (Create3DDatabase(&G3D)==FAILURE)
  349.       {
  350.         printf ("Error creating 3D environment!\n" );
  351.         exit (0);
  352.       } // End if          
  353.     
  354.     G3D.Init ();
  355.  
  356.     DISPLAYDATA DisplayData;
  357.     DisplayData.Mode = VideoMode;
  358.     
  359.     Grafix.SetDisplay ( &DisplayData );
  360.     Grafix.SetPalette ( HVGA, ShadeTable->GetPalette () );
  361.     
  362.     if (Debug)
  363.       VScreen->SetDebugFlag ( TRUE );
  364.     
  365.     VScreen->Create ( IMAGE_8BIT, Grafix.GetWidth ( HVGA ), Grafix.GetHeight ( HVGA ) );
  366.  
  367.     G3D.SetScreenCenter ( VScreen->GetWidth()/2, VScreen->GetHeight()/2 );
  368.  
  369.     Input.Init ();
  370.  
  371.     LONG Count;
  372.     Count = 0;    
  373.  
  374.     MYTIMER MyTimer;
  375.     MyTimer.StartTimer ();
  376.  
  377.     G3DOBJECT *Object;
  378.     Object = G3D.FindObjectByID ( 1 );
  379.  
  380.     IMAGE *DisplayBG = NULL;
  381.     if (BGBitMap)
  382.       {
  383.         DisplayBG = new IMAGE ( IMAGE_TOPDOWN );
  384.         DisplayBG->Create ( IMAGE_8BIT, VScreen->GetWidth(), VScreen->GetHeight() );
  385.         Grafix.SetScaleFactor ( DisplayBG->GetWidth(), BGImage->GetWidth(),
  386.                                 DisplayBG->GetHeight(), BGImage->GetHeight() );
  387.         Grafix.ScaleImage ( BGImage, 0, 0, BGImage->GetWidth(), BGImage->GetHeight(),
  388.                             DisplayBG, 0, 0 );
  389.         Grafix.SetScaleFactor ( 1, 1, 1, 1 );
  390.       } // End if
  391.  
  392.     if (BenchMark)
  393.       {
  394.         DoBenchMark ( &G3D );
  395.         exit(0);
  396.       } // End if
  397.       
  398.     while (Input.IsKeyDown( SC_ESC )==FALSE)
  399.       {
  400.         AddX = AddY = AddZ = 0;
  401.         Count++;
  402.         if (BGBitMap!=TRUE)
  403.           VScreen->Clear ( BGColor );
  404.         else
  405.           {
  406.             Grafix.CopyImage ( DisplayBG, 0, 0, DisplayBG->GetWidth(),
  407.                                DisplayBG->GetHeight(),
  408.                                VScreen, 0, 0 );
  409.           } // End if
  410.  
  411.         if (Object!=NULL)
  412.           Object->Rotate ( ObjRotX, ObjRotY, ObjRotZ );
  413.         if (TextureNumFrames)
  414.           {
  415.             Texture->SetFrame ( CurTextureFrame++ );
  416.             if (CurTextureFrame>=TextureNumFrames)
  417.               CurTextureFrame = 0;
  418.           } // End if
  419.  
  420.         HandleInput ( &G3D, &Camera );
  421.         G3D.ShowView ( &Camera );
  422.         Grafix.DisplayImage ( HVGA, VScreen, 0, 0, VScreen->GetWidth(),
  423.                               VScreen->GetHeight(), 0, 0 );
  424.       } // End while
  425.     MyTimer.EndTimer ();
  426.  
  427.     Input.DeInit ();
  428.     
  429.     Grafix.ResetDisplay ();
  430.  
  431.     float FrameRate;
  432.     FrameRate = MyTimer.GetFrameRate ( Count );
  433.  
  434.     printf ( "Frame rate was %4.2f fps.\n", FrameRate );
  435.  
  436.     delete VScreen;
  437.     delete ShadeTable;
  438.     if (DisplayBG!=NULL)
  439.       delete DisplayBG;
  440.     delete BGImage;  
  441.     return 0;
  442.   END // End of Main Program
  443.   
  444. VOID HandleInput ( G3DSYSTEM* G3D, G3DCAMERA *Camera )
  445.   {
  446.     if (Input.IsKeyDown(SC_F))
  447.       {
  448.         G3D->SetShadeFlags ( SHADE_FLAT );  
  449.       } // End if
  450.     else if (Input.IsKeyDown(SC_G))
  451.       {
  452.         G3D->SetShadeFlags ( SHADE_GOURAUD );  
  453.       } // End else
  454.     else if (Input.IsKeyDown(SC_N))
  455.       {
  456.         G3D->SetShadeFlags ( SHADE_NONE );  
  457.       } // End else
  458.  
  459.     if (Input.IsKeyDown(SC_S))
  460.       {
  461.         G3D->SetFaceFlags ( FACE_SOLID );  
  462.       } // End if
  463.     else if (Input.IsKeyDown(SC_T))
  464.       {
  465.         G3D->SetFaceFlags ( FACE_TEXTURE );  
  466.       } // End else
  467.     else if (Input.IsKeyDown(SC_W))
  468.       {
  469.         G3D->SetFaceFlags ( FACE_WIREFRAME );  
  470.       } // End else
  471.  
  472.     G3DMATERIALLIB *MaterialLib;
  473.     G3DMATERIAL *Material;
  474.  
  475.     MaterialLib = G3D->GetMaterialLib ();
  476.     Material = MaterialLib->GetMaterial ( 0 );
  477.       
  478.     BOOLEAN IsShift;
  479.     IsShift = Input.IsKeyDown(SC_LSHIFT) || Input.IsKeyDown(SC_RSHIFT);
  480.     
  481.     if (Input.IsKeyDown(SC_USCORE))
  482.       {
  483.         if (Material->Transparency<10-1)
  484.           Material->Transparency++;  
  485.       } // End else
  486.       
  487.     if (Input.IsKeyDown(SC_EQUAL))
  488.       {
  489.         if (Material->Transparency>0)
  490.           Material->Transparency--;  
  491.       } // End else
  492.     
  493.     float SpeedRatio = 1.0;
  494.     if (IsShift)
  495.       {
  496.         SpeedRatio = 2.0;  
  497.       } // End if
  498.     
  499.     COLLIDEDATA CollideList[5];
  500.     FLPVECTOR3D Position,EndPt;
  501.     FLPVECTOR3D Dir;
  502.  
  503.     Position = Camera->GetWorldPosition();
  504.     
  505.     if (Input.IsKeyDown(SC_RIGHT))
  506.       {
  507.         Camera->Rotate ( 0, -3*SpeedRatio, 0 );  
  508.       } // End if       
  509.     if (Input.IsKeyDown(SC_LEFT))
  510.       {
  511.         Camera->Rotate ( 0, 3*SpeedRatio, 0 );  
  512.       } // End if
  513.     if (Input.IsKeyDown(SC_UP))
  514.       {
  515.         Camera->Rotate ( -3*SpeedRatio, 0, 0 );  
  516.       } // End if       
  517.     if (Input.IsKeyDown(SC_DOWN))
  518.       {
  519.         Camera->Rotate ( 3*SpeedRatio, 0, 0 );  
  520.       } // End if
  521.  
  522.     LONG CollisionCount;
  523.       
  524.     if (Input.IsKeyDown(SC_A))
  525.       {
  526.         Dir.x = 0;
  527.         Dir.y = 0;
  528.         Dir.z = 1*20;
  529.  
  530.         EndPt = G3D->ComputeNextPos ( Position, Camera->GetAngle(), Dir );
  531.         CollisionCount = G3D->CheckCollision ( Position, EndPt, CollideList, 5, 1.6, 10 );
  532.         if (CollisionCount==0)
  533.           Camera->Move ( EndPt.x-Position.x, EndPt.y-Position.y, EndPt.z-Position.z );
  534.       } // End if       
  535.     if (Input.IsKeyDown(SC_Z))
  536.       {
  537.         Dir.x = 0;
  538.         Dir.y = 0;
  539.         Dir.z = -1*20;
  540.  
  541.         EndPt = G3D->ComputeNextPos ( Position, Camera->GetAngle(), Dir );  
  542.         CollisionCount = G3D->CheckCollision ( Position, EndPt, CollideList, 5, 1.6, 10 );
  543.         if (CollisionCount==0)
  544.           Camera->Move ( EndPt.x-Position.x, EndPt.y-Position.y, EndPt.z-Position.z );
  545.       } // End if
  546.  
  547.     if (FollowCamera)
  548.       {
  549.         Position = Camera->GetWorldPosition();
  550.         MyLight->SetPosition ( Position.x, Position.y, Position.z );  
  551.       } // End if
  552.   } // End of HandleInput 
  553.   
  554. BOOLEAN Create3DDatabase ( G3DSYSTEM *G3D )
  555.   {
  556.     G3DWORLD *NewWorld;
  557.     RGBPALETTE *LocalPal = new RGBPALETTE ();
  558.     COLORTABLE *MatchTable = new COLORTABLE ();
  559.  
  560.     // Create World
  561.     NewWorld = new G3DWORLD ();
  562.     
  563.     printf ("\n**** Creating World ****\n\n" );
  564.  
  565.     // Load Blending Color Table
  566.     if (BlendTable->Load ( BlendFileName )==FAILURE)
  567.       {
  568.         printf ("Error loading Blending Table!\n" );
  569.         exit (0);
  570.       } // End if
  571.     else
  572.       {
  573.         printf ("Blend File Loaded.\n" );
  574.       } // End else
  575.     G3D->SetBlendTable ( BlendTable );
  576.  
  577.     if (DoHaze)
  578.       {
  579.         if (HazeTable->Load ( HazeTableName )==FAILURE)
  580.           {
  581.             printf ("Error loading Hazing Table!\n" );
  582.             exit (0);
  583.           } // End if
  584.         else
  585.           {
  586.             printf ("Haze File Loaded.\n" );
  587.           } // End else
  588.       } // End if
  589.     else
  590.       printf ("Haze is disabled.\n" );
  591.  
  592.     G3D->SetHazing ( DoHaze, HazeScale, HazeTable );
  593.  
  594.     // Create Light Object
  595.     G3DLIGHT *Light;
  596.     Light = new G3DLIGHT ();
  597.     Light->SetName ( "Light01" );
  598.     Light->SetPosition ( LightPosX, LightPosY, LightPosZ );
  599.     if (ShadeTable->Load ( ShadeTableFileName )==FAILURE)
  600.       {
  601.         printf ("Can not load shade table! : %s\n", ShadeTableFileName );
  602.         return FAILURE;  
  603.       } // End if
  604.     else
  605.       {
  606.         printf ("Shade File Loaded.\n" );
  607.       } // End else
  608.  
  609.     Light->SetMaxIntensity ( LightMaxIntensity ); 
  610.     Light->SetMinIntensity ( LightMinIntensity ); 
  611.     Light->SetShadeTable ( ShadeTable );    
  612.     NewWorld->AddObject ( Light );
  613.     MyLight = Light;
  614.  
  615.     // Set Background
  616.     RGBCOLOR BG;
  617.     BG.Red = (BYTE)BGRed;
  618.     BG.Green = (BYTE)BGGreen;
  619.     BG.Blue = (BYTE)BGBlue;
  620.     BGColor = (BYTE)((ShadeTable->GetPalette())->GetClosestColor ( BG ));
  621.     if (BGBitMap)
  622.       {
  623.         if (Grafix.LoadImage ( BGFileName, BGImage, LocalPal )==FAILURE)
  624.           {
  625.             printf ("Can not load Background Image! : %s\n", BGFileName );
  626.             return FAILURE;  
  627.           } // End if
  628.         else
  629.           {
  630.             printf ("Background Image Loaded.\n" );
  631.           } // End else
  632.  
  633.         MatchTable->CopyPalette ( ShadeTable->GetPalette() );
  634.         MatchTable->CreateMatchTable ( LocalPal );
  635.         Grafix.ConvertImage ( BGImage, MatchTable );
  636.       } // End if
  637.  
  638.     // Create Material Library
  639.     G3DMATERIALLIB *MaterialLib;
  640.     MaterialLib = new G3DMATERIALLIB ();
  641.     MaterialLib->CreateMaterials ( 1 );
  642.     MaterialLib->CreateTextures ( 1 );
  643.     G3D->SetMaterialLib ( MaterialLib );
  644.  
  645.     // Add Material to this Material Library
  646.     G3DMATERIAL *Material;
  647.     Material = MaterialLib->GetMaterial ( 0 );
  648.     RGBCOLOR AmbientColor;
  649.     AmbientColor.Red = (BYTE)AmbientRed;
  650.     AmbientColor.Green = (BYTE)AmbientGreen;
  651.     AmbientColor.Blue = (BYTE)AmbientBlue;
  652.     if (UseTransparent)
  653.       Material->Attributes = MATERIAL_TRANSPARENT;
  654.     Material->Transparency = 0;
  655.     Material->Ambient = (ShadeTable->GetPalette())->GetClosestColor ( AmbientColor );
  656.  
  657.     // Add Texture to this Material
  658.     if (MaterialLib->LoadTexture ( 0, TextureFileName, TextureType, ShadeTable->GetPalette() )==FAILURE)
  659.       {
  660.         printf ("Can not load this Texture! : %s\n", TextureFileName );
  661.         return FAILURE;  
  662.       } // End if
  663.     else
  664.       {
  665.         printf ("Texture Loaded.\n" );
  666.       } // End else
  667.       
  668.     Texture = MaterialLib->GetTexture ( 0 );
  669.     TextureNumFrames = Texture->GetNumFrames ();
  670.     Material->SetTexture ( Texture );
  671.     
  672.     // Load objects from file
  673.     LINKEDLIST <G3DOBJECT*> *ObjectList;
  674.     ObjectList = new LINKEDLIST<G3DOBJECT*> ();
  675.     
  676.     if (G3D->Load3DFile ( ObjectFileName, ObjectList, ClockWise, ScaleFactor )==FAILURE)
  677.       {
  678.         printf ("Can not load 3D object! : %s\n", ObjectFileName );
  679.         return FAILURE;  
  680.       } // End if    
  681.     else
  682.       {
  683.         printf ("3D Object(s) Loaded.\n" );
  684.       } // End else      
  685.     
  686.     LISTOBJECT<G3DOBJECT*> *ObjectNode;
  687.     G3DOBJECT *Object;
  688.     G3DPOLYHEDRON *PolyObject;
  689.     
  690.     ObjectNode = ObjectList->GetHead ();
  691.  
  692.     while (ObjectNode!=NULL)
  693.       {
  694.         Object = ObjectNode->Data;
  695.         Object->SetMaxVisibleDistance ( MaxVisibleDistance );
  696.         if (Object->GetObjectType()==OBJECT_TYPE_POLYHEDRON)
  697.           {
  698.             Object->SetPosition ( ObjPosX, ObjPosY, ObjPosZ );
  699.             Object->SetID ( 1 );
  700.  
  701.             PolyObject = (G3DPOLYHEDRON*)Object;  
  702.             PolyObject->SetLightSource ( Light );
  703.  
  704.             PolyObject->SetShadeFlags ( MAX_DETAIL, SHADE_GOURAUD );
  705.             PolyObject->SetFaceFlags ( MAX_DETAIL, FACE_TEXTURE );
  706.             
  707.             PolyObject->SetMaterial ( Material );
  708.             if (MapTexture)
  709.               PolyObject->MapTexture ( U0, V0, U1, V1, U2, V2 );
  710.  
  711.             NewWorld->AddObject ( PolyObject );
  712.             ObjectNode->Data = NULL;
  713.  
  714.             if (!LoadAll)
  715.               break;
  716.           } // End if
  717.                     
  718.         ObjectNode = ObjectNode->NextObject;              
  719.       } // End while
  720.        
  721.     ObjectList->ClearAllNode ();
  722.     delete ObjectList;
  723.     
  724.     delete LocalPal;
  725.     delete MatchTable;
  726.     
  727.     printf ("\n**** World Is Created ****\n" );
  728.  
  729.     G3D->SetWorld ( NewWorld, TRUE );
  730.     return SUCCESS;
  731.   } // End of Create3DDatabase
  732.                                                           
  733. VOID DoBenchMark ( G3DSYSTEM *G3D )
  734.   {
  735.     float FrameRate1,FrameRate2;
  736.  
  737.     LONG Count;
  738.     MYTIMER MyTimer;
  739.  
  740.     G3D->SetViewPort ( 0, 0, 319, 199 );
  741.  
  742.     FrameRate1 = FrameRate2 = 0;
  743.  
  744.     FXPPOINT2D FxpPoints[3];
  745.     
  746.     FxpPoints[0].x=150; FxpPoints[0].y=50;
  747.       FxpPoints[0].u = (LONG)(U0*255*65536); FxpPoints[0].v = (LONG)(V0*255*65536);
  748.       FxpPoints[0].I = (LONG)0; FxpPoints[0].Haze = (LONG)0;
  749.        
  750.     FxpPoints[1].x=50; FxpPoints[1].y=150;   
  751.       FxpPoints[1].u = (LONG)(U1*255*65536); FxpPoints[1].v = (LONG)(V1*255*65536);
  752.       FxpPoints[1].I = (LONG)32; FxpPoints[1].Haze = (LONG)32;
  753.       
  754.     FxpPoints[2].x=150; FxpPoints[2].y=150;
  755.       FxpPoints[2].u = (LONG)(U2*255*65536); FxpPoints[2].v = (LONG)(V2*255*65536);
  756.       FxpPoints[2].I = (LONG)63; FxpPoints[2].Haze = (LONG)63;
  757.  
  758.     MyTimer.StartTimer ();
  759.     Count = 0;
  760.     while (Input.IsKeyDown(SC_ESC)!=TRUE)
  761.       {
  762.         Count++;
  763.         G3D->TestDrawTriangle ( FxpPoints, Texture, 63, Count, SHADE_NONE,
  764.                                 FACE_TEXTURE, NULL,
  765.                                 ShadeTable, NULL ); 
  766.       } // End while
  767.     MyTimer.EndTimer ();
  768.  
  769.     FrameRate1 = MyTimer.GetFrameRate ( Count );
  770.  
  771.     // Slow Version
  772.     while (Input.IsKeyDown(SC_ESC))
  773.       {}
  774.  
  775.     FxpPoints[0].x <<= 16;
  776.     FxpPoints[1].x <<= 16;
  777.     FxpPoints[2].x <<= 16;
  778.  
  779.     FxpPoints[0].I <<= 16;
  780.     FxpPoints[1].I <<= 16;
  781.     FxpPoints[2].I <<= 16;
  782.  
  783.     MyTimer.StartTimer ();
  784.     Count = 0;
  785.     while (Input.IsKeyDown(SC_ESC)!=TRUE)
  786.       {
  787.         Count++;
  788.         G3D->TestDrawTriangle2 ( FxpPoints, Texture, 63, Count, SHADE_NONE,
  789.                                  FACE_TEXTURE, NULL,
  790.                                  ShadeTable, NULL ); 
  791.       } // End while
  792.     MyTimer.EndTimer ();
  793.  
  794.     FrameRate2 = MyTimer.GetFrameRate ( Count );
  795.  
  796.     Input.DeInit ();
  797.     Grafix.ResetDisplay ();
  798.       
  799.     printf ( "1. Frame rate was %4.2f fps.\n", FrameRate1 );
  800.     printf ( "2. Frame rate was %4.2f fps.\n", FrameRate2 );
  801.     getch ();
  802.  
  803.     delete VScreen;
  804.     delete ShadeTable;
  805.     delete BlendTable;
  806.     delete HazeTable;
  807.     delete BGImage;  
  808.   } // End of DoBenchMark
  809.   
  810.